// 变量类型默认是wire型
// 2选1的选择器
module m_mux21(a,b,s,y);
  input a,b,s;
  output y;

  assign y = (~s&a)|(s&b);

endmodule

// 4选1的选择器,过程化描述
module mux_4to1_process (
  input wire [1:0] sel, // 选择信号
  input wire [3:0] data_in, // 数据输入
  output wire data_out       // 数据输出
);

  // 使用条件操作符实现数据选择功能
  assign data_out = (sel == 2'b00) ? data_in[0] :
                    (sel == 2'b01) ? data_in[1] :
                    (sel == 2'b10) ? data_in[2] :
                                    data_in[3];

endmodule

// 4选1的选择器,逻辑代数描述
module mux_4to1_gate (
  input wire sel1, sel0, // 选择信号
  input wire a, b, c, d, // 数据输入
  output wire y         // 数据输出
);

  // 使用与门和或门实现数据选择功能
  assign y = (~sel1 & ~sel0 & a) |
             (~sel1 & sel0 & b) |
              sel1 & ~sel0 & c |
              sel1 & sel0 & d;

endmodule


// 4选1的选择器,逻辑代数描述,处理2位宽的数据
module mux_4to1_gate_2bits (
  input wire [1:0] sel,     // 选择信号,2位
  input wire [1:0] a,       // 数据输入之一
  input wire [1:0] b,       // 数据输入之二
  input wire [1:0] c,       // 数据输入之三
  input wire [1:0] d,       // 数据输入之四
  output wire [1:0] y       // 数据输出,2位
);

  // 使用与门和或门实现数据选择功能
  // 对每一位分别进行选择操作
  assign y[0] = (~sel[1] & ~sel[0] & a[0]) | 
                (~sel[1] & sel[0] & b[0]) | 
                 sel[1] & ~sel[0] & c[0] | 
                 sel[1] & sel[0] & d[0];

  assign y[1] = (~sel[1] & ~sel[0] & a[1]) | 
                (~sel[1] & sel[0] & b[1]) | 
                 sel[1] & ~sel[0] & c[1] | 
                 sel[1] & sel[0] & d[1];

endmodule
